﻿using NearAop;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CS
{
    [AddProxyMethod(typeof(Proxy2), IsUpdateValue = true, IsSetValueOnExit = true)]
    class T05_实例方法代理
    {
        private int value1;
        private int value2;

        public void SetValue(int value1, int value2)
        {
            this.value1 = value1;
            this.value2 = value2;
        }

        public string GetValue(int value1, int value2)
        {
            return $"{this.value1} . {this.value2} . {value1} . {value2}";
        }


        //取消AOP操作
        [SetCancelAop]
        public void Test()
        {
            SetValue(1, 2);
            Console.WriteLine(GetValue(3, 4));
        }
    }

    [AddProxyMethod(typeof(Proxy2), IsUpdateValue = true, IsSetValueOnExit = true)]
    class T05_静态方法
    {
        private static int value1;
        private static int value2;

        public static void SetValue(int value1, int value2)
        {
            T05_静态方法.value1 = value1;
            T05_静态方法.value2 = value2;
        }

        public static string GetValue(int value1, int value2)
        {
            return $"{T05_静态方法.value1} . {T05_静态方法.value2} . {value1} . {value2}";
        }

        //取消AOP操作
        [SetCancelAop]
        public static void Test()
        {
            SetValue(1, 2);
            Console.WriteLine(GetValue(3, 4));
        }
    }

    class Proxy2 : IAopHandlerMethod
    {

        //进入函数时执行
        public void OnEntry(MethodArgs methodArgs)
        {
            //--获取参数的值
            //通过索引获取指定位置的参数值
            var value1 = methodArgs.TryGetValue<int>(0);
            //通过参数名称获取参数值
            var value2 = methodArgs.TryGetValue<int>("value2");

            //修改参数值
            //通过索引修改指定位置的的参数值
            methodArgs.TrySetValue(0, 192);
            //通过参数名称修改参数值
            methodArgs.TrySetValue("value2", 168);


            //获取全部的参数值(包含被修改后的值,内容取决于读取时机)
            var values = string.Join(",", methodArgs.ParamValues);
            //获取方法名
            var methodName = $"{methodArgs.MethodInfo.DeclaringType}.{methodArgs.MethodInfo.Name}";
            Console.WriteLine($"进入[{methodName}]方法时, value1 = {value1} , value2 = {value2}, 全部参数值 = {values}");
        }

        //退出函数时执行
        public TResult OnExit<TResult>(MethodArgs methodArgs, TResult result)
        {
            //获取方法名
            var methodName = $"{methodArgs.MethodInfo.DeclaringType}.{methodArgs.MethodInfo.Name}";

            //获取全部的参数值(包含被修改后的值,内容取决于读取时机)
            var values = string.Join(",", methodArgs.ParamValues);

            Console.WriteLine($"退出[{methodName}]方法时, 全部参数值 = {values}");
            return (TResult)(object)$"{methodName}方法返回 : {result}";
        }
    }
}
